原文发表于 2013-05-20,我的豆瓣日记,摘自我发给女朋友的邮件。
这一篇的内容假设你已经了解了Web的一些基础知识,包括HTTP协议和Web服务器端的知识。
释名
最早的Ajax不叫Ajax,叫AJAX(Asynchronous JavaScript and XML,异步JavaScript与XML),但是本质上AJAX只是一个异步的编程思想,所以当AJAX风靡以后,就直接应用到其他非JavaScript平台(ActionScript等)和非XML数据格式(JSON)中去,所以就成了现在的广义Ajax。
无论是AJAX还是Ajax,其根本的思想都是一个,就是异步处理机制。所以,所有的问题都要从理解了“异步”这一个概念以后开始。
未有Ajax之前
但是在了解异步之前,我们先看一看没有Ajax概念的时候的Web。
HTTP是Web的一个主要协议,支撑起了绝大多数的因特网应用。远程是提供Web内容的HTTP服务器端(server),用户本地是HTTP客户端(浏览器端,browser),服务端和客户端就是通过一个个HTTP请求(request)来进行交互和通信。
而在HTTP定义的数个请求中,使用的最多的就是GET(获取)和POST(发送)请求,一个是用户客户端从服务器获取数据,另外一个是客户端向服务器发送数据。有了这些功能之后两端的通信就变得简单直接,让Web应用更趋于数据化。
这样一个典型的Web应用的模式就是:用户通过HTTP客户端向Web发送请求,服务端解析并处理请求,然后返回请求所对应的内容。于是Web就随着这个模型兴起然后泛滥了,于是出现了很多早期应用:搜索引擎、个人主页、早期的论坛等等。
其实这个模型也并没有什么明显的缺点:只要你设备好网速快,不会有性能和效率的问题;使用SSL也使得安全性有相应的保障。但是总有些不可忽视的问题:用户体验是有些差劲的。客户端的每一个GET或POST请求都要通过整体的重新加载来实现,无论中途的处理时间短到让人觉得多么不可思议,总是还会有客户端的一个刷新过程的,而且还保不齐本来用户都没想过要这样(如果用户马上要通关一个Flash小游戏,但突然要发一个请求,而游戏又没有状态保存机制,那用户不得恨死你!)。
Google很好的解决了这个问题(也许不是第一个)并提供了最佳实践,然后,这个技术就成功的波及到了全球范围,成为一个优秀的Web应用必备的技术之一,就是Ajax。
Thinking Asynchronously
Ajax的典型应用就是页面的部分内容动态更新,或者说,用户不需要重新进行一次完整的页面加载,只是能够在用户想要的时候给出他所要的东西就够了。
于是,一个典型的Web请求就变成了这个样子的:最初加载的方式几乎不变,但是当用户再一次通过已加载的页面进行访问请求Ajax内容的时候,那种自然的流畅感就出现了。与服务器的交互是后台进行的,然后再在客户端前台的呈现部分进行相应的内容更新。这技术就能够支撑得起类似Web QQ这种高端的Web应用了。
想法不错!
CDIO的D和I
构思已经有了,接下来就是设计与实现了。
设计难度其实不大,我们需要一个负责前台动态更新页面的组件,同时需要一个后台跟服务器端通信的组件;同时需要产生Ajax的响应事件的对象就绑定相应的动作,来调用通信组件跟后端通信。SO,大概的框图就出来了。当然,服务端额内容抛开,毕竟只是Parse请求然后再返回对应数据的过程,也不复杂的。
是的,我们需要一个动态更新前台页面的组件,Netscape贡献了JavaScript给我们,而且还有DOM这么好的前台模型及操作组合,这个问题就给解决掉了;跟服务器通信,也有类似的对象存在,标准名称叫做XMLHttpRequest,简称xhr,可以通过这个对象来跟服务器建立连接,然后传输XML数据;动作绑定和事件响应机制本来就是JavaScript所擅长的……也就是说,其实本来一切都准备好了,所以AJAX中的JAX其实已经是一套成熟的可用组件了,而AJAX所的就是把最前面的A给加上然后形式化了而已。
所以总结下来,其实不需要实现,因为该实现的都已经实现了(后来的JSONP代替xhr也是如此),所要做的不过是加上一层顶层封装,让其接口更加简单化和统一,才有了我们今天这种$.ajax(jQuery/zepto.js)的用法。
什么是Ajax
Ajax是一个新的概念(较之于没有Ajax之前,因为现在其实远没有那么“新”了),这种概念结合了之前的多种技术,重新糅合,产生了一种新的Web应用设计方法;Ajax是一种方法,利用这种方法,Web应用程序才渐渐有了更加丰富充实的体验;Ajax带来的是一种异步的思想,而这股思想随之在Web开发领域火热起来,所以才有了今天这么繁盛的场面。
这就是Ajax。
脚注:
CDIO是Concieve、Design、Implement、Operate的缩写,是一套神奇的体系。